package com.mastercard.assets.web.util.reportes;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.reporteForm;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class reportFour {
    
    public static List< datosReporteCuatro > generaReporteCuatro( reporteForm f ) throws MasterCardException{
        
        List< datosReporteCuatro > res = new ArrayList< datosReporteCuatro >( ) ;
        
        String sql = "Select "
                + "p.nombre, cp.cve_campania, cu.nombre, "
                + "c.nombre, ase.nombre, c.fecha_ini, "
                + "c.fecha_fin, count(paq.cve_paquete), ase.cve_asset "
                + "from "
                + "tbl_paquete as paq, "
                + "tbl_asset as ase, "
                + "tbl_campania_paquete as cp, "
                + "tbl_paises as p, "
                + "tbl_usuario as us, "
                + "tbl_campania as c, "
                + "tbl_cuenta as cu "                
                + "where "
                + "paq.cve_asset = ase.cve_asset and cp.cve_paquete = paq.cve_paquete and c.cve_cuenta = cu.cve_cuenta "
                + "and us.cve_usuario = c.cve_usuario_resp and p.cve_pais = us.cve_pais and c.`status`= 1 "
                + "and c.cve_campania = cp.cve_campania and c.bandera = 1" ;
        
        if( f.getPaisR4( ) != 0 ){
            
            sql = sql +" and p.cve_pais = " + f.getPaisR4( ) + "" ;
            
        }
        
        if( f.getCampaniaR4( ) != 0 ){
            
            sql = sql +" and c.cve_campania = " + f.getCampaniaR4( ) + "" ;
            
        }
        
        if( f.getCuentaR4( ) != 0 ){
            
            sql = sql +" and cu.cve_cuenta = " + f.getCuentaR4( ) + "" ;
            
        }
        
        if (f.getAnioR4( ) != 0) {

           String ini = "",
                   fin = "", 
                   mesDiaIni = "-01-01",
                   mesDiaFin = "-12-31",
                   fecAnioIni = f.getAnioR4( ) + "-01-01",
                   fecAniofin = f.getAnioR4( ) + "-12-31" ;
            
            if( f.getPeriodoR4( ).equals("Por Mes") && f.getMesQR4( ) > 0 ){// ini por mes
                
                mesDiaIni = ( f.getMesQR4( ) < 10 ? "-0" +f.getMesQR4( )+"-31" : "-" + f.getMesQR4( )+"-31" ) ;
                mesDiaFin = ( f.getMesQR4( ) < 10 ? "-0" +f.getMesQR4( )+"-01" : "-" + f.getMesQR4( )+"-01" ) ;
                
            }else// fin por mes
                if( f.getPeriodoR4( ).equals("Por Cuarto") && f.getMesQR4( ) > 0 ){// ini por Cuarto
                    
                    if( f.getMesQR4( ) == 13 ){
                        
                        mesDiaIni = "-03-31" ;
                        mesDiaFin = "-01-01" ;
                                
                    }else
                        if( f.getMesQR4( ) == 14 ){
                            
                            mesDiaIni = "-06-31" ;
                            mesDiaFin = "-04-01" ;
                            
                        }else
                            if( f.getMesQR4( ) == 15 ){
                                
                                mesDiaIni = "-09-31" ;
                                mesDiaFin = "-07-01" ;
                            }else
                                if( f.getMesQR4( ) == 16 ){
                                    
                                    mesDiaIni = "-12-31" ;
                                    mesDiaFin = "-10-01" ;
                                    
                                }                    
                    
                }// fin por Cuarto
            
            ini = "" + f.getAnioR4( ) + "" + mesDiaIni ;
            fin = "" + f.getAnioR4( ) + "" + mesDiaFin ;
            
            if( f.getPeriodoR4( ).equals("Total") || f.getMesQR4( ) == 0  ){
                
                sql = sql + " and (c.fecha_ini between '" + fecAnioIni + "' and '" + fecAniofin + "' or "
                    + "c.fecha_fin between '" + fecAnioIni + "' and '" + fecAniofin + "')";
                
            }else{
                
                sql = sql + " and (c.fecha_ini between '" + fecAnioIni + "' and '" + fecAniofin + "' or "
                    + "c.fecha_fin between '" + fecAnioIni + "' and '" + fecAniofin + "') "
                        + "and c.fecha_ini <= '" + ini + "' and c.fecha_fin >= '" + fin + "'" ;                
                
            }
            

        }
        
        sql = sql + " group by c.cve_campania, ase.cve_asset" ;
        
        try{
            
            res = MasterCardDAO.datosParaReporteCuatro( sql ) ;
            
            
        }catch( Exception e ){
            
            e.printStackTrace( ) ;
            
        }
        
        return res ;
        
    }
    
    public static List< datosReporteCuatro > totalesParaR4( List< datosReporteCuatro > listaDR4, reporteForm f )throws MasterCardException {
        
        String fecIni = "" ,
                    fecFin = "" ,
                    mesIni = "" ,
                    mesFin = "" ,
                    anioIni = "" ,
                    anioFin = "" ;
            
        int mIni = 0 ,
                mFin = 0 ,
                yearIni = 0 ,
                yearFin = 0,
                tipo = 0,
                mOq = 0,
                finAsset = 0,
                anioReporte = f.getAnioR4( ) ;
        
        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ) ;        
        
        totalesReporteCuatro tr = new totalesReporteCuatro( ) ;
        
        try{
            
            for( datosReporteCuatro dr4 : listaDR4 ){// listaDR4 INI
            
            float precio = 0 ;
            
            TblCampania camp = MasterCardDAO.getCampania( dr4.getBc( ) ) ;
            TblAsset asset = MasterCardDAO.findAssetById( dr4.getCveAsset( ) ) ;
            
            List< TblPaquete > listPacks = camp.getTblPaquetes( ) ;
            
            for( TblPaquete pack : listPacks ){//listPacks INI
                
                if( pack.getTblAsset( ).getCveAsset( ) == asset.getCveAsset( ) ){
                    
                    if( pack.getHabitacion( ) == 1 && pack.getFondeado( ) == 1 ){//SL
                        precio += asset.getCostoSenLoc( ) ;
                    }else
                        if( pack.getHabitacion( ) == 1 && pack.getFondeado( ) == 2 ){//SR
                            precio += asset.getCostoSenReg( ) ;
                        }else
                            if( pack.getHabitacion( ) == 2 && pack.getFondeado( ) == 1 ){//DL
                                precio += asset.getCostoDobLoc( ) ;
                            }else
                                if( pack.getHabitacion( ) == 2 && pack.getFondeado( ) == 2 ){//DR
                                    precio += asset.getCostoDobReg( ) ;
                                }
                    
                }
                
            }// listPacks FIN
            
            dr4.setPrecio( precio ) ;
            // CADENAS
            fecIni = dr4.getIni( ).toString( ) ;
            fecFin = dr4.getFin( ).toString( ) ;
            mesIni = fecIni.substring(5, 7) ;
            mesFin = fecFin.substring(5, 7) ;
            anioIni = fecIni.substring(0, 4) ;
            anioFin = fecFin.substring(0, 4) ;
            // ENTEROS
            mIni = Integer.parseInt( mesIni ) ;
            mFin = Integer.parseInt( mesFin ) ;
            yearIni = Integer.parseInt( anioIni ) ;
            yearFin = Integer.parseInt( anioFin ) ;
            tipo = 0 ;
            mOq = 0 ;
            Date endAsset = asset.getFecFinCamp( ) ;            
            finAsset = Integer.parseInt( sdf.format( endAsset ).substring(5, 7) ) ;
            
            if( yearIni < yearFin && yearIni == anioReporte ){
                // SE LA CAMPAÑA NO EMPIEZA Y TERMINA EN EL MISMO AÑO && EL AÑO DE INICIO ES == AL QUE PIDEN EN EL REPORTE
                mFin = 12 ;
                
            }else
                if( yearIni < yearFin && yearFin == anioReporte ){
                    // SE LA CAMPAÑA NO EMPIEZA Y TERMINA EN EL MISMO AÑO && EL AÑO DE TERMINO ES == AL QUE PIDEN EN EL REPORTE
                    
                    mIni = 1 ;
                }
            
            if( f.getPeriodoR4( ).equals("Por Mes")  ){
                
                if( f.getMesQR4( ) == 0 ){
                    tr = calculaMeses( 3, f.getMesQR4( ), mIni, mFin, finAsset ) ;
                }else{
                    tr = calculaMeses( 1, f.getMesQR4( ), mIni, mFin, finAsset ) ;
                }
                
                
            }else
                if( f.getPeriodoR4( ).equals("Por Cuarto") ){
                    
                   tr = calculaMeses( 2, f.getMesQR4( ), mIni, mFin, finAsset ) ;
                    
                }else
                    if( f.getPeriodoR4( ).equals("Total") ){
                        
                        tr = calculaMeses( 3, f.getMesQR4( ), mIni, mFin, finAsset ) ;
                        
                    }
            
            dr4.setTr4( tr ) ;                        
            
        }// listaDR4 fin
            
        }catch( Exception e ){
            e.printStackTrace( ) ; 
        }
        
        
        return listaDR4 ;
        
    }
    
    public static totalesReporteCuatro calculaMeses( int tipo, int mOq, int ini, int fin, int finAsset )throws MasterCardException{
        
        totalesReporteCuatro tr = new totalesReporteCuatro( ) ;
        
        tr.setEnero( 0 ) ; tr.setFebrero(0); tr.setMarzo(0); tr.setAbril(0); tr.setMayo(0); tr.setJunio(0);
        tr.setJulio(0); tr.setAgosto(0); tr.setSeptiembre(0); tr.setOctubre(0); tr.setNoviembre(0); tr.setDiciembre(0);
        tr.setQ1(0); tr.setQ2(0); tr.setQ3(0); tr.setQ4(0);
        
        int q1 = 0, q2 = 0, q3 = 0, q4 = 0 ;
        
        switch( tipo ) {
            
            case 1:
                
                for( int i = ini ; i <= fin ; i++ ){// barre meses de inicio a fin INI
                    
                    if( i == 1 && mOq == 1 ){                        
                        tr.setEnero( tr.getEnero( ) + 1 ) ;
                        if( i == finAsset )
                            break ;
                    }else
                        if( i == 2 && mOq == 2 ){
                            tr.setFebrero( tr.getFebrero( ) + 1 ) ;
                            if( i == finAsset )
                                break ;
                        }else
                            if( i == 3 && mOq == 3 ){
                                tr.setMarzo( tr.getMarzo( ) + 1 ) ;
                                if( i == finAsset )
                                    break ;
                            }else
                                if( i == 4 && mOq == 4 ){
                                    tr.setAbril( tr.getAbril( ) + 1 ) ;
                                    if( i == finAsset )
                                        break ;
                                }else
                                    if( i == 5 && mOq == 5 ){
                                        tr.setMayo( tr.getMayo( ) + 1 ) ;
                                        if( i == finAsset )
                                            break ;
                                    }else
                                        if( i == 6 && mOq == 6 ){
                                            tr.setJunio( tr.getJunio( ) + 1 ) ;
                                            if( i == finAsset )
                                                break ;
                                        }else
                                            if( i == 7 && mOq == 7 ){
                                                tr.setJulio( tr.getJulio( ) + 1 ) ;
                                                if( i == finAsset )
                                                    break ;
                                            }else
                                                if( i == 8 && mOq == 8 ){
                                                    tr.setAgosto( tr.getAgosto( ) + 1 ) ;
                                                    if( i == finAsset )
                                                        break ;
                                                }else
                                                    if( i == 9 && mOq == 9 ){
                                                        tr.setSeptiembre( tr.getSeptiembre( ) + 1 ) ;
                                                        if( i == finAsset )
                                                            break ;
                                                    }else
                                                        if( i == 10 && mOq == 10 ){
                                                            tr.setOctubre( tr.getOctubre( ) + 1 ) ;
                                                            if( i == finAsset )
                                                                break ;
                                                        }else
                                                            if( i == 11 && mOq == 11 ){
                                                                tr.setNoviembre( tr.getNoviembre( ) + 1 ) ;
                                                                if( i == finAsset )
                                                                    break ;
                                                            }else
                                                                if( i == 12 && mOq == 12 ){
                                                                    tr.setDiciembre( tr.getDiciembre( ) + 1 ) ;
                                                                    if( i == finAsset )
                                                                        break ;
                                                                }
                    
                }// barre meses de inicio a fin FIN
                
                break ;
            case 2:
                
                if( mOq == 0 ){
                    
                    for( int i = ini ; i <= fin ; i++ ){// barre para todos los cuartos INI
                    
                        if( ( i == 1 || i == 2 || i == 3 ) && ( q1 == 0 ) ){
                            tr.setQ1( tr.getQ1( ) + 1 ) ;
                            q1 = 1 ;
                            if( i == finAsset )
                                break ;
                        }else
                            if( ( i == 4 || i == 5 || i == 6 ) && ( q2 == 0 ) ){
                                tr.setQ2( tr.getQ2( ) + 1 ) ;
                                q2 = 1 ;
                                if( i == finAsset )
                                    break ;
                            }else
                                if( ( i == 7 || i == 8 || i == 9 ) && ( q3 == 0 ) ){
                                    tr.setQ3( tr.getQ3( ) + 1 ) ;
                                    q3 = 1 ;
                                    if( i == finAsset )
                                        break ;
                                }else
                                    if( ( i == 10 || i == 11 || i == 12 ) && ( q4 == 0 ) ){
                                        tr.setQ4( tr.getQ4( ) + 1 ) ;
                                        q4 = 1 ;
                                        if( i == finAsset )
                                            break ;
                                    }

                    }// barre para todos los cuartos FIN
                    
                }else{
                    
                    for( int i = ini ; i <= fin ; i++ ){// barre para todos los cuartos INI
                    
                        if( ( i == 1 || i == 2 || i == 3 ) && ( q1 == 0 ) && ( mOq == 13 ) ){
                            tr.setQ1( tr.getQ1( ) + 1 ) ;
                            q1 = 1 ;
                            if( i == finAsset )
                                break ;
                        }else
                            if( ( i == 4 || i == 5 || i == 6 ) && ( q2 == 0 ) && ( mOq == 14 ) ){
                                tr.setQ2( tr.getQ2( ) + 1 ) ;
                                q2 = 1 ;
                                if( i == finAsset )
                                    break ;
                            }else
                                if( ( i == 7 || i == 8 || i == 9 ) && ( q3 == 0 ) && ( mOq == 15 ) ){
                                    tr.setQ3( tr.getQ3( ) + 1 ) ;
                                    q3 = 1 ;
                                    if( i == finAsset )
                                        break ;
                                }else
                                    if( ( i == 10 || i == 11 || i == 12 ) && ( q4 == 0 ) && ( mOq == 16 ) ){
                                        tr.setQ4( tr.getQ4( ) + 1 ) ;
                                        q4 = 1 ;
                                        if( i == finAsset )
                                            break ;
                                    }

                    }// barre para todos los cuartos FIN
                    
                }
                                
                break ;
            case 3:
                
                for( int i = ini ; i <= fin ; i++ ){// barre meses de inicio a fin INI
                    
                    if( i == 1 ){                        
                        tr.setEnero( tr.getEnero( ) + 1 ) ;
                        if( i == finAsset )
                            break ;
                    }else
                        if( i == 2 ){
                            tr.setFebrero( tr.getFebrero( ) + 1 ) ;
                            if( i == finAsset )
                                break ;
                        }else
                            if( i == 3 ){
                                tr.setMarzo( tr.getMarzo( ) + 1 ) ;
                                if( i == finAsset )
                                    break ;
                            }else
                                if( i == 4 ){
                                    tr.setAbril( tr.getAbril( ) + 1 ) ;
                                    if( i == finAsset )
                                        break ;
                                }else
                                    if( i == 5 ){
                                        tr.setMayo( tr.getMayo( ) + 1 ) ;
                                        if( i == finAsset )
                                            break ;
                                    }else
                                        if( i == 6 ){
                                            tr.setJunio( tr.getJunio( ) + 1 ) ;
                                            if( i == finAsset )
                                                break ;
                                        }else
                                            if( i == 7 ){
                                                tr.setJulio( tr.getJulio( ) + 1 ) ;
                                                if( i == finAsset )
                                                    break ;
                                            }else
                                                if( i == 8 ){
                                                    tr.setAgosto( tr.getAgosto( ) + 1 ) ;
                                                    if( i == finAsset )
                                                        break ;
                                                }else
                                                    if( i == 9 ){
                                                        tr.setSeptiembre( tr.getSeptiembre( ) + 1 ) ;
                                                        if( i == finAsset )
                                                            break ;
                                                    }else
                                                        if( i == 10 ){
                                                            tr.setOctubre( tr.getOctubre( ) + 1 ) ;
                                                            if( i == finAsset )
                                                                break ;
                                                        }else
                                                            if( i == 11 ){
                                                                tr.setNoviembre( tr.getNoviembre( ) + 1 ) ;
                                                                if( i == finAsset )
                                                                    break ;
                                                            }else
                                                                if( i == 12 ){
                                                                    tr.setDiciembre( tr.getDiciembre( ) + 1 ) ;
                                                                    if( i == finAsset )
                                                                        break ;
                                                                }
                    
                }// barre meses de inicio a fin FIN
                
                break ;
            
        }
        
        return tr;
        
    }
    
    public static int[ ] totales( List< datosReporteCuatro > listaDR4 )throws MasterCardException{
        
        int[ ] totales = new int[ 16 ] ;
        
        for( datosReporteCuatro dr4 : listaDR4 ){// listaDR4 INI
            
            totalesReporteCuatro tr = dr4.getTr4( ) ;
            
            totales[ 0 ] = totales[ 0 ] + tr.getEnero( )  ; totales[ 1 ] = totales[ 1 ] + tr.getFebrero( ) ;
            totales[ 2 ] = totales[ 2 ] + tr.getMarzo( ) ; totales[ 3 ] = totales[ 3 ] + tr.getAbril( ) ;
            totales[ 4 ] = totales[ 4 ] + tr.getMayo( ) ; totales[ 5 ] = totales[ 5 ] + tr.getJunio( ) ;
            totales[ 6 ] = totales[ 6 ] + tr.getJulio( ) ; totales[ 7 ] = totales[ 7 ] + tr.getAgosto( ) ;
            totales[ 8 ] = totales[ 8 ] + tr.getSeptiembre( ) ; totales[ 9 ] = totales[ 9 ] + tr.getOctubre( ) ;
            totales[ 10 ] = totales[ 10 ] + tr.getNoviembre( ) ; totales[ 11 ] = totales[ 11 ] + tr.getDiciembre( ) ;
            totales[ 12 ] = totales[ 12 ] + tr.getQ1( ) ; totales[ 13 ] = totales[ 13 ] + tr.getQ2( ) ;
            totales[ 14 ] = totales[ 14 ] + tr.getQ3( ) ; totales[ 15 ] = totales[ 15 ] + tr.getQ3( ) ;
            
        }// listaDR4 fin
        
        return  totales ;
        
    }
    
}
